#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
//int main()
//{
	//printf和scanf介绍:
	//一、printf
	//1.占位符:就是这个位置可以用其他值带入
	//%d:十进制整数//int
	//int a = 3;
	//printf("there are %d apples\n", a);//占位符的第一个符号一律为% 第二个字符表示占位符的类型
	//%s:字符串
	//printf("%s says it is %d o'clock", "zhangsan", 6);//两个占位符及以上就有顺序关系
	//printf()参数与占位符是一一对应关系，如果有n个占位符，参数就有n+1个，如果参数少于对应的占位符，printf（）可能输出内存中的任意值
	
	//2.占位符列举:
	//%c:字符.//char
	//%f:小数(包含float类型和double类型）。//float %f  double %lf  long double %Lf
	//%hd:十进制 short int 类型
	//%hu:十进制unsigned short int类型
	//%ld:十进制long int 类型
	//%lu:十进制unsigned long int类型
	//%lld:十进制long long int类型
	//%p:指针（用来打印地址）
	//%s：字符串
	//%u：无符号整数 unsigned int类型
	//%x：十六进制整数
	//%zu：size_t类型



	////3.输出格式:
	////I:printf()允许限定占位符的最小宽度
	//printf("%5d\n", 123);//限定宽度为5，前面空两个空格强行凑够5个宽度 //默认右对齐
	//printf("%-5dxxx\n", 123);//后面空两个空格再打印xxx			  //左对齐	
	//printf("%5d\n", 123456);//超过限定宽度是多宽打印多宽
	//printf("%12f\n", 123.45);//%f打印小数时，默认有六位小数,所以前面有两个空格

	////II:总是显示正负号:
	//printf("%+d\n", 100);//在d前加+会显示正负号
	//printf("%+d\n", -100);

	////III:限定小数位数:
	//printf("%.2f\n", 123.45);//表示只保留两位小数
	//printf("%12.2f\n", 123.45);//表示12格宽，保留两位小数
	//printf("%*.*f\n", 12, 2, 123.45);//%*也相当于占位符，可以传参数，和上面的等效

	////IV:输出部分字符串:
	//printf("%.3s", "123456");//表示只输出前三个字符串


	////二、scanf
	////1.基本用法:读取键盘输入，按下回车键会把值放入变量里
	//int score = 0;//初始化
	//printf("请输入一个成绩");
	//scanf("%d", &score);//scanf函数输入的值时放在一个地址处，所以需要一个地址
	//printf("成绩为:%d\n", score);
	//
	//int a = 0;
	//int b = 0;
	//float c = 0;
	//scanf("%d%d%f", &a, &b, &c);//空白字符会被跳过
	//scanf("%d,%d,%f", &a, &b, &c);//中间有逗号的话输入也要加入逗号

	////scanf处理用户输入的原理为:输入的东西先放入缓存，按下回车开始读取，一直读到不符合条件的字符，接着从这个字符继续向后读取.
	//int x = 0;
	//float y = 0.0;
	////输入"    -13.45e12# 0"
	//scanf("%d", &x);
	//printf("x=%d\n", x);//前面的空格跳过,读到-13停止，因为下一个字符不符合整数的条件
	//scanf("%f", &y);
	//printf("y=%f\n",y);//从上一个停止的字符开始读取，就是从.开始，结果为: 0.45e12(0.45*10^12)因为#不符合条件，不读取
	////0.45这样的数字在内存中无法精确的保存 可能保存为0.44999980
	//printf("y=%e\n", y);//用科学计数法打印出来是正确的

	////2.scanf的返回值(在算法技术题目中，OJ编程题目中，在要输入多种数据时会用到)
	//int a = 0;
	//int b = 0;
	//float f = 0.0;
	//int ret = scanf("%d %d %f", &a, &b, &f);
	//printf("a=%d , b=%d , c=%f\n", a, b, f);
	//printf("ret=%d", ret);//正确读取多少数字就返回该值(在vs环境中 连续按3次ctrl+z会读取失败 返回-1)（在devc++中按一次就失败）
	////多组输入的场景:
	//int a = 0;
	//int b = 0;
	//while (scanf("%d %d", &a, &b) == 2)
	//{
	//	printf("%d\n", a + b);
	//}
	
	//3.占位符:
	//%c:char字符
	//%f:float类型
	//%lf:double类型
	//%Lf:long double类型
	//%s:字符串
	//%[]:在方括号中指定一组匹配的字符，遇到不在集合之中的字符，匹配将会停止.
	//除了%c都会忽略起手的空白字符，%c总是返回当前第一个字符，无论该字符是否为空格(也就是说%s会忽略空白字符)
	//char ch = 0;
	//scanf(" %c", &ch);//在%c前加一个空格表示跳过0个或多个空白字符
	//printf("ch = %c", ch);
	//特别注意%s:从当前第一个非空白字符开始读取，直到遇到空白字符为止
	//char arr[10];
	//scanf("%s", arr);//输入abc def(arr本来就是地址所以不用)
	//printf("%s\n", arr);//只打印abc (遇到空格\换行符\制表符就停止)
	//所以scanf不适合读取可能包含空格的字符串
	//char arr[10];
	//scanf("%[^\n]s", arr);//scanf一直往后读取，遇到空格不停止，遇到\n才会停止
	//printf("%s\n", arr);
	//scanf函数在读取数据的时候，不会看目标空间是否有足够的空间,所以在一定程度上是不安全的
	//char arr[10] = "xxxx";
	//scanf("%s", arr);//scanf会在读取到字符串后会在末尾存储一个\0
	//printf("%s", arr);
	//为了防止输入的字符超过最长长度你可以:
	//char arr[11];//一共有11个位置
	//scanf("%10s", arr);//只能放10个字符，多的字符会被舍弃，还剩下一个位置留给\0(这样超字符了就不会报错了,只会把你超出的字符删掉)
	//printf("%s", arr);
	
	//4.赋值忽略符:
	//为了避免输入限定格式,scanf提供了赋值忽略符 *
	//用法:把*加在任何百分号的后面，该占位符就不会返回值，解析后将被丢弃
	//int a = 0;
	//int b = 0;
	//int c = 0;
	//scanf("%d%*c%d%*c%d", &a, &b, &c);//%*c表示读到符号舍弃掉因此输入格式可以为:数字|任何字符|数字|任何字符|数字
	//printf("%d-%d-%d", a, b, c);

	//return 0;
//}

int main()
{
	//分支和循环:
	
	//一、if语句
	//1.if
	//语法:
	//if(表达式)  语句  表达式为真就输出语句,为假就不做输出
	//练习:判断一个数是不是奇数?
	//int n = 0;
	//scanf("%d", &n);
	//if (n % 2 == 1)
	//	printf("是奇数");

	//2.else
	//int n = 0;
	//scanf("%d", &n);
	//if (n % 2 == 1)
	//	printf("是奇数\n");
	//else
	//	printf("是偶数\n");

	//3.分支中包含多条语句
	//int a = 0;
	//printf("请输入年龄:");
	//scanf("%d", &a);
	//if (a >= 18)
	//{
	//	printf("已经成年\n");//默认在if的语句后只能是一个语句,加入{}后可以控制多条语句
	//	printf("可以谈恋爱了\n");
	//}
	//else
	//{
	//	printf("未成年\n");
	//	printf("不准谈恋爱\n");
	//}

	//4.嵌套if
	//if else语句中，else可以与另一个if语句连用,构成多重判断
	//比如:输入一个整数，判断是0还是正数还是负数
	//int num = 0;
	//scanf("%d", &num);
	//if (num == 0)
	//{
	//	printf("为0\n");
	//}
	//else
	//{
	//	if (num < 0)
	//	{
	//		printf("为负数\n");
	//	}
	//	else
	//	{
	//		printf("为正数\n");
	//	}
	//}
	//

	//这样写也没问题:相当于是if(情况1){结果1}  else if(情况2){结果2}  else if(情况3){结果3}  else{结果4}
	//int num = 0;
	//scanf("%d", &num);
	//if (num == 0)
	//{
	//	printf("为0\n");
	//}
	//else if (num < 0)
	//{
	//	printf("为负数\n");
	//}
	//else
	//{
	//	printf("为正数\n");
	//}

	//练习:
	//printf("请输入一个年龄:");
	//int num = 0;
	//scanf("%d", &num);
	//if (num < 18)
	//	printf("少年");
	//else if (num > 18 && num < 44)//或者不加后面的小于也可以
	//	printf("青年");
	//else if (num > 45 && num < 59)
	//	printf("中老年");
	//else if (num > 60 && num < 89)
	//	printf("老年");
	//else
	//	printf("老寿星");

	////5.悬空else问题:else总是跟最接近它的if匹配
	//int a = 0;
	//int b = 2;
	//if (a == 1)
	//	if (b == 2)//和下面的else匹配
	//		printf("hehe\n");
	//else//和离它最近的if匹配
	//	printf("haha\n");
	////上面代码的打印结果为:无结果

	//二、关系操作符
	int a = 3 < 5;
	printf("%d\n", a);

	//当一个变量和一个常量在比较相等的时候最好将常量放在==的左边
	//int b = 4;
	//if (3 = b)//在这一行编译器会精准报错，因为常量3不能被修改。如果换成b=3是被允许的，编译器不会报错，也就找不到问题所在
	//	printf("hehe\n");




	return 0;
}